home *** CD-ROM | disk | FTP | other *** search
/ Aminet 2 / Aminet AMIGA CDROM (1994)(Walnut Creek)[Feb 1994][W.O. 44790-1].iso / Aminet / gfx / edit / TSMrph23s.lha / TSM23s.lha / saveilbm.c < prev    next >
C/C++ Source or Header  |  1993-09-11  |  5KB  |  182 lines

  1. //    $Author: M_J_Paddock $
  2. //    $Date: 1992/08/08 01:07:26 $
  3. //    $Revision: 1.3 $
  4.  
  5. /* saveilbm.c 04/92  C. Scheppner CBM
  6.  *
  7.  * High-level ILBM save routines
  8.  */
  9.  
  10. // Minor change to error handling MJP
  11.  
  12. #define INTUI_V36_NAMES_ONLY
  13.  
  14. #include "iffp/ilbm.h"
  15. #include "iffp/ilbmapp.h"
  16.  
  17. extern struct Library *GfxBase;
  18.  
  19. /* screensave.c
  20.  *
  21.  * Given an ILBMInfo with a  currently available (not in use)
  22.  *   ParseInfo->iff IFFHandle, a screen pointer, filename, and
  23.  *   optional chunklist, will save screen as an ILBM
  24.  * The struct Chunk *chunklist1 and 2 are for chunks you wish written
  25.  * out other than BMHD, CMAP, and CAMG (they will be screened out
  26.  * because they are computed and written separately).
  27.  *
  28.  * Note -  screensave passes NULL for transparent color and mask
  29.  *
  30.  * Returns 0 for success or an IFFERR (libraries/iffparse.h)
  31.  */
  32. /* MJP
  33. LONG screensave(struct ILBMInfo *ilbm,
  34.             struct Screen *scr,
  35.             struct Chunk *chunklist1, struct Chunk *chunklist2,
  36.             UBYTE *filename)
  37. {
  38. extern struct Library *GfxBase;
  39. UWORD *colortable, count;
  40. ULONG modeid;
  41. LONG error;
  42. int k;
  43.  
  44.     if(GfxBase->lib_Version >= 36)
  45.     modeid=GetVPModeID(&scr->ViewPort);
  46.     else
  47.     modeid = scr->ViewPort.Modes & OLDCAMGMASK;
  48.  
  49.     count = scr->ViewPort.ColorMap->Count;
  50.     if(colortable = (UWORD *)AllocMem(count << 1, MEMF_CLEAR))
  51.     {
  52.     for(k=0; k<count; k++)    colortable[k]=GetRGB4(scr->ViewPort.ColorMap,k);
  53.  
  54.         error = saveilbm(ilbm, &scr->BitMap, modeid,
  55.         scr->Width, scr->Height, scr->Width, scr->Height,
  56.         colortable, count, 4,
  57.         mskNone, 0,
  58.         chunklist1, chunklist2, filename);
  59.     FreeMem(colortable,count << 1);
  60.     }
  61.     else error = IFFERR_NOMEM;
  62.     return(error);
  63. }
  64. */
  65.  
  66. /* saveilbm
  67.  *
  68.  * Given an ILBMInfo with a currently available (not-in-use)
  69.  *   ParseInfo->iff IFFHandle, a BitMap ptr,
  70.  *   modeid, widths/heights, colortable, ncolors, bitspergun,
  71.  *   masking, transparent color, optional chunklists, and filename,
  72.  *   will save the bitmap as an ILBM.
  73.  *
  74.  *  if bitspergun=4,  colortable is words, each with nibbles 0RGB
  75.  *  if bitspergun=8,  colortable is byte guns of RGBRGB etc. (like a CMAP)
  76.  *  if bitspergun=32, colortable is ULONG guns of RGBRGB etc.
  77.  *     Only the high eight bits of each gun will be written to CMAP.
  78.  *     Four bit guns n will be saved as nn
  79.  *
  80.  * The struct Chunk *chunklist is for chunks you wish written
  81.  * other than BMHD, CMAP, and CAMG (they will be screened out)
  82.  * because they are calculated and written separately
  83.  *
  84.  * Returns 0 for success, or an IFFERR
  85.  */
  86. LONG saveilbm(struct ILBMInfo *ilbm,
  87.         struct BitMap *bitmap, ULONG modeid,
  88.         WORD width, WORD height, WORD pagewidth, WORD pageheight,
  89.         APTR colortable, UWORD ncolors, UWORD bitspergun,
  90.         WORD masking, WORD transparentColor,
  91.         struct Chunk *chunklist1, struct Chunk *chunklist2,
  92.         UBYTE *filename)
  93. {
  94. struct IFFHandle *iff;
  95. struct Chunk *chunk;
  96. ULONG chunkID;
  97. UBYTE *bodybuf;
  98. LONG size, error = 0L;
  99. #define BODYBUFSZ    4096
  100.  
  101.     iff = ilbm->ParseInfo.iff;
  102.  
  103.     if(!(modeid & 0xFFFF0000))    modeid &= OLDCAMGMASK;
  104.  
  105.     if(!(bodybuf = AllocMem(BODYBUFSZ,MEMF_PUBLIC)))
  106.     {
  107.     message(SI(MSG_IFFP_NOMEM),NULL,9);        // MJP 9 = HE_IFFMEM
  108.     return(IFFERR_NOMEM);
  109.     }
  110.  
  111.     if(!(error = openifile(ilbm, filename, IFFF_WRITE)))
  112.     {
  113.     D(bug("Opened %s for write\n",filename));
  114.  
  115.     error = PushChunk(iff, ID_ILBM, ID_FORM, IFFSIZE_UNKNOWN);
  116.  
  117.     D(bug("After PushChunk FORM ILBM - error = %ld\n", error));
  118.  
  119.         initbmhd(&ilbm->Bmhd, bitmap, masking, cmpByteRun1, transparentColor,
  120.                     width, height, pagewidth, pageheight, modeid);
  121.  
  122.     D(bug("Error before putbmhd = %ld\n",error));
  123.  
  124.     CkErr(putbmhd(iff,&ilbm->Bmhd));    
  125.  
  126.     if(colortable)    CkErr(putcmap(iff,colortable,ncolors,bitspergun));
  127.  
  128.     ilbm->camg = modeid;
  129.     D(bug("before putcamg - error = %ld\n",error));
  130.     if (colortable) {
  131.         CkErr(putcamg(iff,&modeid));    // MJP
  132.     }
  133.  
  134.     D(bug("Past putBMHD, CMAP, CAMG - error = %ld\n",error));
  135.  
  136.     /* Write out chunklists 1 & 2 (if any), except for
  137.      * any BMHD, CMAP, or CAMG (computed/written separately)
  138.      */
  139. /* MJP
  140.     for(chunk = chunklist1; chunk; chunk = chunk->ch_Next)
  141.         {
  142.         D(bug("chunklist1 - have a %.4s\n",&chunk->ch_ID));
  143.         chunkID = chunk->ch_ID;
  144.         if((chunkID != ID_BMHD)&&(chunkID != ID_CMAP)&&(chunkID != ID_CAMG))
  145.         {
  146.         size = chunk->ch_Size==IFFSIZE_UNKNOWN ?
  147.             strlen(chunk->ch_Data) : chunk->ch_Size;
  148.         D(bug("Putting %.4s\n",&chunk->ch_ID));
  149.         CkErr(PutCk(iff, chunkID, size, chunk->ch_Data));
  150.         }
  151.         }
  152.  
  153.     for(chunk = chunklist2; chunk; chunk = chunk->ch_Next)
  154.         {
  155.         chunkID = chunk->ch_ID;
  156.         D(bug("chunklist2 - have a %.4s\n",&chunk->ch_ID));
  157.         if((chunkID != ID_BMHD)&&(chunkID != ID_CMAP)&&(chunkID != ID_CAMG))
  158.         {
  159.         size = chunk->ch_Size==IFFSIZE_UNKNOWN ?
  160.             strlen(chunk->ch_Data) : chunk->ch_Size;
  161.         D(bug("Putting %.4s\n",&chunk->ch_ID));
  162.         CkErr(PutCk(iff, chunkID, size, chunk->ch_Data));
  163.         }
  164.         }
  165. */
  166.     /* Write out the BODY
  167.      */
  168.     CkErr(putbody(iff, bitmap, NULL, &ilbm->Bmhd, bodybuf, BODYBUFSZ));
  169.  
  170.     D(bug("Past putbody - error = %ld\n",error));
  171.  
  172.  
  173.     CkErr(PopChunk(iff));    /* close out the FORM */
  174.     closeifile(ilbm);    /* and the file */
  175.     }
  176.  
  177.     FreeMem(bodybuf,BODYBUFSZ);
  178.  
  179.     return(error);
  180. }
  181.  
  182.